/**
 * PanelSeccion.java
 */

 /**
 *  AdSec: Administrador de Secundarias
 *  Copyright (C) 2009 Daniela Ramírez Chaves (dannyrch@gmail.com)
 *  Copyright (C) 2009 Leonel Salazar Valverde (leo87sv@gmail.com)
 *
 *  This file is part of AdSec.
 *  AdSec is free software: you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation, either version 3 of the License, or
 *  (at your option) any later version.
 *
 *  AdSec is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU General Public License for more details.
 *
 *  You should have received a copy of the GNU General Public License
 *  along with AdSec.  If not, see <http://www.gnu.org/licenses/>.
 */

package adsec.presentacion;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.util.Iterator;
import java.util.LinkedList;
import javax.swing.DefaultComboBoxModel;
import javax.swing.JComboBox;
import javax.swing.JOptionPane;
import javax.swing.ListSelectionModel;
import javax.swing.SpinnerNumberModel;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import javax.swing.table.DefaultTableModel;
import adsec.entidades.Anio;
import adsec.entidades.Docente;
import adsec.entidades.Estado;
import adsec.entidades.LlaveValor;
import adsec.entidades.Nivel;
import adsec.entidades.Permiso;
import adsec.entidades.Seccion;
import adsec.negocios.AdministradorSeguridad;
import adsec.negocios.ControladoraAnio;
import adsec.negocios.ControladoraDocente;
import adsec.negocios.ControladoraNivel;
import adsec.negocios.ControladoraSeccion;
import adsec.negocios.UtilidadesCapaNegocios;
import org.jdesktop.application.Action;


public class PanelSeccion extends javax.swing.JPanel implements ListSelectionListener, ActionListener, ItemListener{

    private AdministradorSeguridad admSeguridad;
    private ControladoraNivel controladoraNivel;
    private ControladoraSeccion controladoraSeccion;
    private ControladoraAnio controladoraAño;
    private Permiso permisoNivelSeccion;
    private Estado estado;
    private String errorAño = "Debe ser un año válido:\n1.El campo solo permite formato númerico\n2. Verifique la cantidad de digitos, debe de ser 4 digitos";
    private String errorNivel = "Debe ser un nivel válido:\n1.El campo solo permite formato númerico";
    private String errorSeccion = "Debe ser una sección válida:\n1.El campo solo permite formato númerico";
    private String errorAñoNivel = "El campo de año, nivel y sección deben ser completados";

    /** Creates new form PanelNivelSeccion */
    public PanelSeccion() {
        initComponents();
        this.iniciarPanelNivelSeccion();
    }

   public void valueChanged(ListSelectionEvent evento) {
       int filas = ((DefaultTableModel)this.gridSecciones.getModel()).getRowCount();
        if(filas > 0 && estado.getEstadoActual() == Estado.CONSULTAR && evento.getValueIsAdjusting()){
            int fila = this.gridSecciones.getSelectedRow();
            if(fila >= 0){
                int numAño = Integer.parseInt(this.cbAño.getSelectedItem().toString());
                int numNivel = Integer.parseInt(this.cbNivel.getSelectedItem().toString());
                int numSeccion = Integer.parseInt(this.gridSecciones.getModel().getValueAt(fila, 1).toString());
                Seccion seccion = new Seccion();
                seccion.setAnio(numAño);
                seccion.setNivel(numNivel);
                seccion.setSeccion(numSeccion);
                this.consultarSeccion(seccion);
            }
        }
    }

    public void itemStateChanged(ItemEvent e){
        JComboBox cb =(JComboBox)e.getSource();
        boolean encontrado = false;
        if(e.getStateChange() == ItemEvent.SELECTED){
            if(cb.equals(this.cbAño)){
                this.seleccionaronAño();
                encontrado = true;
            }
            if(!encontrado && cb.equals(this.cbNivel)){
                this.seleccionaronNivel();
                encontrado = true;
            }
            if(encontrado){
                this.cargarSecciones();
                this.cbSeccion.setSelectedIndex(-1);
                this.cargarGridSeccion();
            }
            if(!encontrado && cb.equals(this.cbSeccion)){
                this.seleccionaronSeccion();
                encontrado = true;
            }
            if(!encontrado && cb.equals(cbCedulaGuia)){
                this.seleccionaronCedProfGuia();
                encontrado = true;
            }
            if(!encontrado && cb.equals(cbNombreProfGuia)){
                this.seleccionaronNomProfGuia();
                encontrado = true;
            }
        }
    }

    private void seleccionaronAño(){
        int index = cbAño.getSelectedIndex();
        if(index >= 0){
            if(estado.getEstadoActual() == Estado.INSERTAR){
                this.cbNivel.setEnabled(true);
            }
        }
    }

    private void seleccionaronNivel(){
        int index = cbNivel.getSelectedIndex();
        if(index >= 0){
            if(estado.getEstadoActual() == Estado.INSERTAR){
                this.cbSeccion.setEnabled(true);
            }
        }
    }

    private void seleccionaronSeccion(){
        if(estado.getEstadoActual() == Estado.CONSULTAR){
            int numAño = Integer.parseInt(this.cbAño.getSelectedItem().toString());
            int numNivel = Integer.parseInt(this.cbNivel.getSelectedItem().toString());
            int numSeccion = Integer.parseInt(this.cbSeccion.getSelectedItem().toString());
            Seccion seccion = new Seccion();
            seccion.setAnio(numAño);
            seccion.setNivel(numNivel);
            seccion.setSeccion(numSeccion);
            this.consultarSeccion(seccion);
        }
    }
    
    private void seleccionaronCedProfGuia(){
        this.cbNombreProfGuia.removeItemListener(this);
        this.cbNombreProfGuia.setSelectedIndex(this.cbCedulaGuia.getSelectedIndex());
        this.cbNombreProfGuia.addItemListener(this);
    }
    
    private void seleccionaronNomProfGuia(){
        this.cbCedulaGuia.removeItemListener(this);
        this.cbCedulaGuia.setSelectedIndex(this.cbNombreProfGuia.getSelectedIndex());
        this.cbCedulaGuia.addItemListener(this);
    }

    public void actionPerformed(ActionEvent e){
        boolean encontrado = false;
        if(estado.getEstadoActual() == Estado.INSERTAR){
            JComboBox cb =(JComboBox)e.getSource();
            if(e.getActionCommand().equals("comboBoxEdited")){
                if(cb.equals(this.cbAño)){
                    this.accionAñoEditado();
                    encontrado = true;
                }
                if(!encontrado && cb.equals(this.cbNivel)){
                    this.accionNivelEditado();
                    encontrado = true;
                }
                if(!encontrado && cb.equals(this.cbSeccion)){
                    this.accionSeccionEditada();
                    encontrado = true;
                }
            }
        }
    }//fin actionPerformed

    public void accionAñoEditado(){
        Object añoSelected = this.cbAño.getSelectedItem();
        if(añoSelected != null){
            String seleccion = añoSelected.toString();
            if(!isNumber(seleccion) || seleccion.length() != 4 ){
                this.cbNivel.setEnabled(false);
                this.cbAño.setSelectedItem("");
                this.cbAño.setSelectedIndex(-1);
                JOptionPane.showMessageDialog(null, errorAño, "ERROR", JOptionPane.ERROR_MESSAGE);
            }else{
                this.cbNivel.setEnabled(true);
            }//fin if/else
        }
    }//fin accionAñoEditado

    public void accionNivelEditado(){
        Object nivelSelected = this.cbNivel.getSelectedItem();
        if(nivelSelected != null){
            String seleccion = nivelSelected.toString();
            if(!isNumber(seleccion) || seleccion.trim().isEmpty() ){
                this.cbSeccion.setEnabled(false);
                this.cbNivel.setSelectedItem("");
                this.cbNivel.setSelectedIndex(-1);
                JOptionPane.showMessageDialog(null, errorNivel, "ERROR", JOptionPane.ERROR_MESSAGE);
            }else{
                this.cbSeccion.setEnabled(true);
                this.cargarSecciones();
            }//fin if/else
        }
    }//fin accionNivelEditado

    public void accionSeccionEditada(){
        Object seccionSelected = this.cbSeccion.getSelectedItem();
        if(seccionSelected != null){
            String seleccion = seccionSelected.toString();
            if(!isNumber(seleccion) || seleccion.trim().isEmpty() ){
                this.cbSeccion.setSelectedItem("");
                this.cbSeccion.setSelectedIndex(-1);
                JOptionPane.showMessageDialog(null, errorSeccion, "ERROR", JOptionPane.ERROR_MESSAGE);
            }//fin if
        }
    }//fin accionSeccionEditada


    public boolean isNumber(String numero){
        boolean resultado = true;
        int numeroEntero = 0;
        try{
            numeroEntero = Integer.parseInt(numero);
        }catch(NumberFormatException excepcion){
            resultado = false;
        }
        return resultado;
    }
    
    private void iniciarPanelNivelSeccion(){
        this.admSeguridad = AdministradorSeguridad.getInstancia();
        this.controladoraNivel = new ControladoraNivel();
        this.controladoraSeccion = new ControladoraSeccion();
        this.controladoraAño = new ControladoraAnio();
        this.permisoNivelSeccion = this.admSeguridad.getPermiso(UtilidadesCapaNegocios.moduloSecciones);
        this.estado = new Estado();
        this.limpiarCampos();
        this.habilitarCampos(false);
        this.habilitarBotonesIME(this.permisoNivelSeccion.isInsertar(),false, false);
        this.habilitarAceptarCancelar(false);
        this.cargarAños();
        this.cargarNiveles();
        this.cbAño.setSelectedIndex(-1);
        this.cbNivel.setSelectedIndex(-1);
        this.cargarComboBoxDatosDocente();
    }

    private void habilitarBotonesIME(boolean insertar, boolean modificar, boolean eliminar){
        this.btnInsertar.setEnabled(insertar);
        this.btnModificar.setEnabled(modificar);
        this.btnEliminar.setEnabled(eliminar);
    }

    private void habilitarAceptarCancelar(boolean habilitar){
        this.btnAceptar.setEnabled(habilitar);
        this.btnCancelar.setEnabled(habilitar);
    }

    private void limpiarCampos(){
        this.cbNivel.setSelectedIndex(-1);
        this.cbAño.setSelectedIndex(-1);
        this.cbSeccion.setSelectedIndex(-1);
        ((DefaultComboBoxModel)cbSeccion.getModel()).removeAllElements();
        this.spinCupoMaximo.getModel().setValue(0);
        this.txtCantidadEstudiantes.setText("");
    }

    private void habilitarCampos(boolean habilitar){
        this.cbAño.setEditable(habilitar);
        this.cbNivel.setEditable(habilitar);
        this.cbSeccion.setEditable(habilitar);
        this.cbCedulaGuia.setEnabled(habilitar);
        this.cbNombreProfGuia.setEnabled(habilitar);
        this.spinCupoMaximo.setEnabled(habilitar);
    }

    private void cargarAños(){
        cbAño.removeItemListener(this);
        ((DefaultComboBoxModel)cbAño.getModel()).removeAllElements();
        LinkedList<Anio> años = this.controladoraAño.consultarAnios();
        Iterator<Anio> iterador = años.iterator();
        while(iterador.hasNext()){
            String elemento = Integer.toString(iterador.next().getAnio());
            ((DefaultComboBoxModel)this.cbAño.getModel()).addElement(elemento);
        }
        cbAño.addItemListener(this);        
    }

    private void cargarNiveles(){
        cbNivel.removeItemListener(this);
        ((DefaultComboBoxModel)cbNivel.getModel()).removeAllElements();
        LinkedList<Nivel> niveles = this.controladoraNivel.consultarNivelesTodos();
        Iterator<Nivel> iterador = niveles.iterator();
        while(iterador.hasNext()){
            String elemento = Integer.toString(iterador.next().getNivel());
            ((DefaultComboBoxModel)this.cbNivel.getModel()).addElement(elemento);
        }
        cbNivel.addItemListener(this);
    }

    private void cargarSecciones(){
        Object añoSelect = cbAño.getSelectedItem();
        Object nivelSelect = cbNivel.getSelectedItem();
        if(añoSelect != null && nivelSelect != null){
            cbSeccion.removeItemListener(this);
            ((DefaultComboBoxModel)cbSeccion.getModel()).removeAllElements();
            Anio año = new Anio();
            Nivel nivel = new Nivel();
            año.setAnio(Integer.parseInt(añoSelect.toString()));
            nivel.setNivel(Integer.parseInt(nivelSelect.toString()));
            LinkedList<Seccion> secciones = this.controladoraSeccion.consultarSecciones(año, nivel);
            Iterator<Seccion> iterador = secciones.iterator();
            while(iterador.hasNext()){
                Seccion sec = iterador.next();
                String elemento = Integer.toString(sec.getSeccion());
                ((DefaultComboBoxModel)this.cbSeccion.getModel()).addElement(elemento);
            }
            cbSeccion.addItemListener(this);
        }
    }

    private void cargarGridSeccion(){
        Object añoSelect = cbAño.getSelectedItem();
        Object nivelSelect = cbNivel.getSelectedItem();
        if(añoSelect != null && nivelSelect != null){
            this.limpiarGridSecciones();
            Anio año = new Anio();
            año.setAnio(Integer.parseInt(añoSelect.toString()));
            Nivel nivel = new Nivel();
            nivel.setNivel(Integer.parseInt(nivelSelect.toString()));
            LinkedList<Seccion> secciones = this.controladoraSeccion.consultarSecciones(año, nivel);
            Iterator<Seccion> iterador = secciones.iterator();
            while(iterador.hasNext()){
                Seccion sec = iterador.next();
                Object arregloDatos[] = new Object[3];
                arregloDatos[0] = sec.getNivel();
                arregloDatos[1] = sec.getSeccion();
                arregloDatos[2] = sec.getApellidosProfGuia()+ " " + sec.getNombreProfGuia();
                ((DefaultTableModel)this.gridSecciones.getModel()).addRow(arregloDatos);
            }
        }
    }

    private void limpiarGridSecciones(){
        ((DefaultTableModel)this.gridSecciones.getModel()).setRowCount(0);
    }

    private void cargarComboBoxDatosDocente(){
        ControladoraDocente contDocente = new ControladoraDocente();
        LinkedList<Docente> listaDocentes = contDocente.consultarDocentes();
        DefaultComboBoxModel modeloCedula = new DefaultComboBoxModel();
        DefaultComboBoxModel modeloNombreApellidos = new DefaultComboBoxModel();
        modeloCedula.addElement("");
        modeloNombreApellidos.addElement("");
        Iterator<Docente> iterador = listaDocentes.iterator();
        while(iterador.hasNext()){
            Docente docente = iterador.next();
            modeloCedula.addElement(docente.getCedula());
            modeloNombreApellidos.addElement(docente.getNombre() + " " + docente.getApellidos());
        }//fin de while
        this.cbCedulaGuia.setModel(modeloCedula);
        this.cbNombreProfGuia.setModel(modeloNombreApellidos);
    }//fin de cargarComboBoxDatosDocente
    
    private int insertarNivel(Nivel nivel){
        int resultadoNivel = UtilidadesCapaNegocios.QUERY_OK;
        if(!UtilidadesCapaNegocios.existeLlave(Nivel.nombreTabla, Nivel.nivelNC, Integer.toString(nivel.getNivel()) )){
            resultadoNivel = controladoraNivel.insertarNivel(nivel);
        }
        return resultadoNivel;
    }
    
    private int insertarAño(Anio año){
        int resultadoAño = UtilidadesCapaNegocios.QUERY_OK;
        if(!UtilidadesCapaNegocios.existeLlave(Anio.nombreTabla, Anio.anioNC, Integer.toString(año.getAnio()))){
            resultadoAño = this.controladoraAño.insertarAnio(año);
        }
        return resultadoAño;
    }
    
    private void insertarSeccion(){
        Anio año = obtenerDatosAño();
        Nivel nivel = obtenerNivel();
        Seccion seccion = obtenerDatosSeccion();
        //Verificar si existe o no la sección
        LinkedList<LlaveValor> listaLlaves = new LinkedList<LlaveValor>();
        listaLlaves.add(new LlaveValor(Seccion.anioNC, seccion.getAnio()));
        listaLlaves.add(new LlaveValor(Seccion.nivelNC, seccion.getNivel()));
        listaLlaves.add(new LlaveValor(Seccion.seccionNC, seccion.getSeccion()));
        if(!UtilidadesCapaNegocios.existenLlaves(Seccion.nombreTabla, listaLlaves)){
            //Insertar año si no existe
            int resultadoAño = insertarAño(año);
            //Insertar nivel si no existe
            int resultadoNivel = insertarNivel(nivel);
            //Insertar Seccion
            int resultadoSeccion = controladoraSeccion.insertarSeccionNiveles(seccion);
            boolean resultado = resultadoNivel == UtilidadesCapaNegocios.QUERY_OK;
            resultado &= resultadoAño == UtilidadesCapaNegocios.QUERY_OK;
            resultado &= resultadoSeccion == UtilidadesCapaNegocios.QUERY_OK;
            if(resultado){
                JOptionPane.showMessageDialog(null, "La sección fue insertada exitosamente");
                this.volverConsultar();
            }else{
                String mensaje = UtilidadesCapaNegocios.getErrorOperacion(UtilidadesCapaNegocios.moduloSecciones, UtilidadesCapaNegocios.opInsertar);
                JOptionPane.showMessageDialog(null, mensaje, "ERROR",JOptionPane.ERROR_MESSAGE);
            }
        }//fin de if
        else{
            JOptionPane.showMessageDialog(null, "La sección "+ seccion.getNivel()+ "-" +
                    seccion.getSeccion() + " ya existe en el año "+seccion.getAnio(), "ERROR",JOptionPane.ERROR_MESSAGE);
        }//fin de else

    }//fin de insertarSeccion

    private void modificarSeccion(){
        Anio año = obtenerDatosAño();
        Nivel nivel = obtenerNivel();
        Seccion seccion = obtenerDatosSeccion();
        //Verificar si existe o no la sección
        LinkedList<LlaveValor> listaLlaves = new LinkedList<LlaveValor>();
        listaLlaves.add(new LlaveValor(Seccion.anioNC, seccion.getAnio()));
        listaLlaves.add(new LlaveValor(Seccion.nivelNC, seccion.getNivel()));
        listaLlaves.add(new LlaveValor(Seccion.seccionNC, seccion.getSeccion()));
        if(UtilidadesCapaNegocios.existenLlaves(Seccion.nombreTabla, listaLlaves)){
            int resultadoSeccion = controladoraSeccion.modificarSeccion(seccion);
            if(resultadoSeccion == UtilidadesCapaNegocios.QUERY_OK){
                JOptionPane.showMessageDialog(null, "La sección fue modificada exitosamente");
                this.volverConsultar();
            }else{
                String mensaje = UtilidadesCapaNegocios.getErrorOperacion(UtilidadesCapaNegocios.moduloSecciones, UtilidadesCapaNegocios.opModificar);
                JOptionPane.showMessageDialog(null, mensaje, "ERROR",JOptionPane.ERROR_MESSAGE);
            }
        }else{
            JOptionPane.showMessageDialog(null, "La sección "+ seccion.getNivel()+ "-" +
                    seccion.getSeccion() + " ya no existe en el año "+seccion.getAnio(), "ERROR",JOptionPane.ERROR_MESSAGE);
        }//fin de else
    }

    private void eliminarSeccion(){
        Anio año = obtenerDatosAño();
        Nivel nivel = obtenerNivel();
        Seccion seccion = obtenerDatosSeccion();
        //Verificar si existe o no la sección
        LinkedList<LlaveValor> listaLlaves = new LinkedList<LlaveValor>();
        listaLlaves.add(new LlaveValor(Seccion.anioNC, seccion.getAnio()));
        listaLlaves.add(new LlaveValor(Seccion.nivelNC, seccion.getNivel()));
        listaLlaves.add(new LlaveValor(Seccion.seccionNC, seccion.getSeccion()));
        if(UtilidadesCapaNegocios.existenLlaves(Seccion.nombreTabla, listaLlaves)){
            int resultadoSeccion = controladoraSeccion.eliminarSeccion(seccion);
            if(resultadoSeccion == UtilidadesCapaNegocios.QUERY_OK){
                JOptionPane.showMessageDialog(null, "La sección fue eliminada exitosamente");
                this.volverConsultar();
                this.limpiarCampos();
                this.cbCedulaGuia.setSelectedItem("");
            }else{
                String mensaje = UtilidadesCapaNegocios.getErrorOperacion(UtilidadesCapaNegocios.moduloSecciones, UtilidadesCapaNegocios.opEliminar);
                JOptionPane.showMessageDialog(null, mensaje, "ERROR",JOptionPane.ERROR_MESSAGE);
            }
        }else{
            JOptionPane.showMessageDialog(null, "La sección "+ seccion.getNivel()+ "-" +
                    seccion.getSeccion() + " ya no existe en el año "+seccion.getAnio(), "ERROR",JOptionPane.ERROR_MESSAGE);
        }//fin de else
    }

    private Seccion obtenerDatosSeccion(){
        Anio año = obtenerDatosAño();
        Nivel nivel = obtenerNivel();
        //Crear la sección
        Seccion seccion = new Seccion();
        seccion.setNivel(nivel.getNivel());
        seccion.setAnio(año.getAnio());
        int cupo = Integer.parseInt(spinCupoMaximo.getValue().toString());
        seccion.setCupoMaximo(cupo);
        seccion.setSeccion(Integer.parseInt(cbSeccion.getSelectedItem().toString()));
        String cedulaProfGuia = cbCedulaGuia.getSelectedItem().toString();
        if(!cedulaProfGuia.trim().isEmpty()){
            seccion.setCedProfGuia(cedulaProfGuia);
        }
        return seccion;
    }

    private void consultarSeccion(Seccion sec){
        this.habilitarBotonesIME(permisoNivelSeccion.isInsertar(), permisoNivelSeccion.isModificar(), permisoNivelSeccion.isEliminar());
        Seccion seccion = this.controladoraSeccion.consultarSeccion(sec);
        this.cbAño.setSelectedItem(Integer.toString(seccion.getAnio()));
        this.cbNivel.setSelectedItem(Integer.toString(seccion.getNivel()));
        this.cbSeccion.setSelectedItem(Integer.toString(seccion.getSeccion()));
        String cedula = "";
        if(!seccion.getCedProfGuia().equals(UtilidadesCapaNegocios.CEDULA_INVALIDA)){
           cedula = seccion.getCedProfGuia();
        }
        this.cbCedulaGuia.setSelectedItem(cedula);
        this.spinCupoMaximo.setValue(seccion.getCupoMaximo());    
        int cantidadEstudiantes = controladoraSeccion.obtenerCantidadEstudiantesSeccion(seccion);
        if(cantidadEstudiantes >= 0){
            this.txtCantidadEstudiantes.setText(Integer.toString(cantidadEstudiantes));
        }
    }

    private Anio obtenerDatosAño(){
        //Crear el Año
        int añoSeleccionado = Integer.parseInt(cbAño.getSelectedItem().toString());
        Anio año = new Anio();
        año.setAnio(añoSeleccionado);
        return año;
    }

    private Nivel obtenerNivel(){
        //Crear el nivel
        Nivel nivel = new Nivel();
        nivel.setNivel(Integer.parseInt(cbNivel.getSelectedItem().toString()));
        return nivel;
    }

    private void volverConsultar(){
        this.estado.setEstadoActual(Estado.CONSULTAR);
        this.habilitarBotonesIME(permisoNivelSeccion.isInsertar(), false, false);
        this.habilitarCampos(false);
        this.cbAño.setEnabled(true);
        this.cbNivel.setEnabled(true);
        this.cbSeccion.setEnabled(true);
        this.habilitarAceptarCancelar(false);
        Object añoSelected = cbAño.getSelectedItem();
        Object nivelSelected = cbNivel.getSelectedItem();
        Object seccionSelected = cbSeccion.getSelectedItem();
        if(añoSelected != null && nivelSelected != null && seccionSelected != null){
            this.cargarAños();
            this.cargarNiveles();
            cbAño.setSelectedItem(añoSelected.toString());
            cbNivel.setSelectedItem(nivelSelected.toString());
            this.cargarGridSeccion();
            this.cargarSecciones();
            cbSeccion.setSelectedItem(seccionSelected.toString());
        }
    }

    @Action
    public void insertandoSeccion() {
        this.estado.setEstadoActual(Estado.INSERTAR);
        this.limpiarCampos();
        this.limpiarGridSecciones();
        this.habilitarBotonesIME(false, false, false);
        this.habilitarAceptarCancelar(true);
        this.habilitarCampos(true);
        this.cbNivel.setEnabled(false);
        this.cbSeccion.setEnabled(false);
        this.spinCupoMaximo.setValue(25);
        this.cargarComboBoxDatosDocente();
    }

    @Action
    public void modificandoSeccion() {
        this.estado.setEstadoActual(Estado.MODIFICAR);
        this.habilitarBotonesIME(false, false, false);
        this.habilitarAceptarCancelar(true);
        this.cbAño.setEnabled(false);
        this.cbNivel.setEnabled(false);
        this.cbSeccion.setEnabled(false);
        this.cbCedulaGuia.setEnabled(true);
        this.cbNombreProfGuia.setEnabled(true);
        this.spinCupoMaximo.setEnabled(true);
        Object cedulaSelected = this.cbCedulaGuia.getSelectedItem();
        if(cedulaSelected != null){
            String cedulaDocente = cedulaSelected.toString();
            this.cargarComboBoxDatosDocente();
            this.cbCedulaGuia.setSelectedItem(cedulaDocente);
        }
    }

    @Action
    public void eliminandoSeccion() {
        Animador.animar();
        if(this.mostrarMensajeConfirmacion(UtilidadesCapaNegocios.opEliminar, "ELIMINAR")){
            this.eliminarSeccion();
        }
        Animador.detenerAnimacion();
    }
    /**
     ** Muestra un mensaje de confirmación para que el usuario decida si realmente
     ** quiere llevar a cabo una operación
     ** @param operacion Código de operación realizada, tomada de UtilidadesCapaNegocios
     ** @param titulo Título a mostrar en el cuadro de confirmación
     ** @return Confirmación: true si el usuario acepta, false en otro caso.
     **/
    private boolean mostrarMensajeConfirmacion(int operacion,String titulo){
        boolean resultado = true;
        String mensaje = UtilidadesCapaNegocios.getMensajeConfirmacion(UtilidadesCapaNegocios.moduloSecciones, operacion);
        int respuesta = JOptionPane.showConfirmDialog(null, mensaje,titulo ,JOptionPane.YES_NO_OPTION,JOptionPane.WARNING_MESSAGE);
        resultado = respuesta == JOptionPane.OK_OPTION;
        return resultado;
    }//fin de mostrarMensajeConfirmacion

    private boolean verificarDatosObligatorios(){
        boolean resultado = true;
        Object seleccionAño = cbAño.getSelectedItem();
        Object seleccionNivel = cbNivel.getSelectedItem();
        Object seleccionSeccion = cbSeccion.getSelectedItem();
        resultado &= seleccionAño != null && seleccionNivel != null && seleccionSeccion != null;
        return resultado;
    }

    @Action
    public void accionAceptar() {
        Animador.animar();
        switch(estado.getEstadoActual()){
            case Estado.INSERTAR:
                if(this.mostrarMensajeConfirmacion(UtilidadesCapaNegocios.opInsertar, "INSERTAR")){
                    if(verificarDatosObligatorios()){
                       this.insertarSeccion();
                    }else{
                       JOptionPane.showMessageDialog(null, errorAñoNivel, "ERROR", JOptionPane.ERROR_MESSAGE);
                    }
                }
            break;
            case Estado.MODIFICAR:
                if(this.mostrarMensajeConfirmacion(UtilidadesCapaNegocios.opModificar, "MODIFICAR")){
                    if(verificarDatosObligatorios()){
                       this.modificarSeccion();
                    }else{
                       JOptionPane.showMessageDialog(null, errorAñoNivel, "ERROR", JOptionPane.ERROR_MESSAGE);
                    }
                }
            break;
        }
        Animador.detenerAnimacion();
    }

    @Action
    public void accionCancelar() {
        this.limpiarCampos();
        this.limpiarGridSecciones();
        this.volverConsultar();
    }


    /** This method is called from within the constructor to
     * initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is
     * always regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
    private void initComponents() {

        btnInsertar = new javax.swing.JButton();
        btnModificar = new javax.swing.JButton();
        btnEliminar = new javax.swing.JButton();
        cbAño = new javax.swing.JComboBox();
        lbAñoSeccion = new javax.swing.JLabel();
        lbNivelSeccion = new javax.swing.JLabel();
        cbNivel = new javax.swing.JComboBox();
        lbSeccion = new javax.swing.JLabel();
        cbSeccion = new javax.swing.JComboBox();
        lbProfesorGuia = new javax.swing.JLabel();
        cbCedulaGuia = new javax.swing.JComboBox();
        cbNombreProfGuia = new javax.swing.JComboBox();
        lbCupoMaximo = new javax.swing.JLabel();
        spinCupoMaximo = new javax.swing.JSpinner(new SpinnerNumberModel(0,0,100,1) );
        lbCantidadEstudiantes = new javax.swing.JLabel();
        txtCantidadEstudiantes = new javax.swing.JTextField();
        scrollGridSecciones = new javax.swing.JScrollPane();
        gridSecciones = new javax.swing.JTable();
        btnAceptar = new javax.swing.JButton();
        btnCancelar = new javax.swing.JButton();
        jLabel1 = new javax.swing.JLabel();
        jLabel2 = new javax.swing.JLabel();
        jLabel3 = new javax.swing.JLabel();

        org.jdesktop.application.ResourceMap resourceMap = org.jdesktop.application.Application.getInstance(adsec.presentacion.LiceoEscazuApp.class).getContext().getResourceMap(PanelSeccion.class);
        setBorder(javax.swing.BorderFactory.createTitledBorder(resourceMap.getString("Form.border.title"))); // NOI18N
        setMinimumSize(new java.awt.Dimension(660, 420));
        setName("Form"); // NOI18N
        setPreferredSize(new java.awt.Dimension(660, 420));

        javax.swing.ActionMap actionMap = org.jdesktop.application.Application.getInstance(adsec.presentacion.LiceoEscazuApp.class).getContext().getActionMap(PanelSeccion.class, this);
        btnInsertar.setAction(actionMap.get("insertandoSeccion")); // NOI18N
        btnInsertar.setText(resourceMap.getString("btnInsertar.text")); // NOI18N
        btnInsertar.setName("btnInsertar"); // NOI18N

        btnModificar.setAction(actionMap.get("modificandoSeccion")); // NOI18N
        btnModificar.setText(resourceMap.getString("btnModificar.text")); // NOI18N
        btnModificar.setName("btnModificar"); // NOI18N

        btnEliminar.setAction(actionMap.get("eliminandoSeccion")); // NOI18N
        btnEliminar.setText(resourceMap.getString("btnEliminar.text")); // NOI18N
        btnEliminar.setName("btnEliminar"); // NOI18N

        cbAño.setMaximumSize(new java.awt.Dimension(31, 25));
        cbAño.setName("cbAño"); // NOI18N

        lbAñoSeccion.setText(resourceMap.getString("lbAñoSeccion.text")); // NOI18N
        lbAñoSeccion.setName("lbAñoSeccion"); // NOI18N

        lbNivelSeccion.setText(resourceMap.getString("lbNivelSeccion.text")); // NOI18N
        lbNivelSeccion.setName("lbNivelSeccion"); // NOI18N

        cbNivel.setMaximumSize(new java.awt.Dimension(31, 25));
        cbNivel.setName("cbNivel"); // NOI18N

        lbSeccion.setText(resourceMap.getString("lbSeccion.text")); // NOI18N
        lbSeccion.setName("lbSeccion"); // NOI18N

        cbSeccion.setMaximumSize(new java.awt.Dimension(31, 25));
        cbSeccion.setName("cbSeccion"); // NOI18N

        lbProfesorGuia.setText(resourceMap.getString("lbProfesorGuia.text")); // NOI18N
        lbProfesorGuia.setName("lbProfesorGuia"); // NOI18N

        cbCedulaGuia.setName("cbCedulaGuia"); // NOI18N

        cbNombreProfGuia.setName("cbNombreProfGuia"); // NOI18N

        lbCupoMaximo.setText(resourceMap.getString("lbCupoMaximo.text")); // NOI18N
        lbCupoMaximo.setName("lbCupoMaximo"); // NOI18N

        spinCupoMaximo.setName("spinCupoMaximo"); // NOI18N

        lbCantidadEstudiantes.setText(resourceMap.getString("lbCantidadEstudiantes.text")); // NOI18N
        lbCantidadEstudiantes.setName("lbCantidadEstudiantes"); // NOI18N

        txtCantidadEstudiantes.setEditable(false);
        txtCantidadEstudiantes.setText(resourceMap.getString("txtCantidadEstudiantes.text")); // NOI18N
        txtCantidadEstudiantes.setName("txtCantidadEstudiantes"); // NOI18N

        scrollGridSecciones.setName("scrollGridSecciones"); // NOI18N

        gridSecciones.setModel(new javax.swing.table.DefaultTableModel(
            new Object [][] {

            },
            new String [] {
                "Nivel", "Sección", "Profesor(a)"
            }
        ) {
            boolean[] canEdit = new boolean [] {
                false, false, false
            };

            public boolean isCellEditable(int rowIndex, int columnIndex) {
                return canEdit [columnIndex];
            }
        });
        gridSecciones.setName("gridSecciones"); // NOI18N
        scrollGridSecciones.setViewportView(gridSecciones);
        gridSecciones.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
        gridSecciones.getSelectionModel().addListSelectionListener(this);

        btnAceptar.setAction(actionMap.get("accionAceptar")); // NOI18N
        btnAceptar.setText(resourceMap.getString("btnAceptar.text")); // NOI18N
        btnAceptar.setName("btnAceptar"); // NOI18N

        btnCancelar.setAction(actionMap.get("accionCancelar")); // NOI18N
        btnCancelar.setText(resourceMap.getString("btnCancelar.text")); // NOI18N
        btnCancelar.setName("btnCancelar"); // NOI18N

        jLabel1.setForeground(resourceMap.getColor("jLabel1.foreground")); // NOI18N
        jLabel1.setText(resourceMap.getString("jLabel1.text")); // NOI18N
        jLabel1.setName("jLabel1"); // NOI18N

        jLabel2.setForeground(resourceMap.getColor("jLabel2.foreground")); // NOI18N
        jLabel2.setText(resourceMap.getString("jLabel2.text")); // NOI18N
        jLabel2.setName("jLabel2"); // NOI18N

        jLabel3.setForeground(resourceMap.getColor("jLabel3.foreground")); // NOI18N
        jLabel3.setText(resourceMap.getString("jLabel3.text")); // NOI18N
        jLabel3.setName("jLabel3"); // NOI18N

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this);
        this.setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
                        .addGroup(layout.createSequentialGroup()
                            .addContainerGap()
                            .addComponent(scrollGridSecciones, javax.swing.GroupLayout.DEFAULT_SIZE, 626, Short.MAX_VALUE))
                        .addGroup(layout.createSequentialGroup()
                            .addGap(52, 52, 52)
                            .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                                .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
                                    .addComponent(btnAceptar)
                                    .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                                    .addComponent(btnCancelar))
                                .addGroup(layout.createSequentialGroup()
                                    .addComponent(btnInsertar)
                                    .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                                    .addComponent(btnModificar)
                                    .addGap(6, 6, 6)
                                    .addComponent(btnEliminar)))))
                    .addGroup(layout.createSequentialGroup()
                        .addContainerGap()
                        .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
                            .addComponent(lbProfesorGuia)
                            .addComponent(lbNivelSeccion)
                            .addComponent(lbCantidadEstudiantes)
                            .addComponent(lbCupoMaximo)
                            .addComponent(lbSeccion)
                            .addComponent(lbAñoSeccion))
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                            .addGroup(layout.createSequentialGroup()
                                .addComponent(cbCedulaGuia, javax.swing.GroupLayout.PREFERRED_SIZE, 157, javax.swing.GroupLayout.PREFERRED_SIZE)
                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                                .addComponent(cbNombreProfGuia, javax.swing.GroupLayout.PREFERRED_SIZE, 233, javax.swing.GroupLayout.PREFERRED_SIZE))
                            .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING, false)
                                .addComponent(txtCantidadEstudiantes, javax.swing.GroupLayout.Alignment.LEADING)
                                .addComponent(spinCupoMaximo, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.PREFERRED_SIZE, 46, javax.swing.GroupLayout.PREFERRED_SIZE))
                            .addGroup(layout.createSequentialGroup()
                                .addComponent(cbAño, javax.swing.GroupLayout.PREFERRED_SIZE, 79, javax.swing.GroupLayout.PREFERRED_SIZE)
                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                                .addComponent(jLabel1))
                            .addGroup(layout.createSequentialGroup()
                                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING, false)
                                    .addComponent(cbNivel, javax.swing.GroupLayout.Alignment.LEADING, 0, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                                    .addComponent(cbSeccion, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.PREFERRED_SIZE, 59, javax.swing.GroupLayout.PREFERRED_SIZE))
                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                                    .addComponent(jLabel3)
                                    .addComponent(jLabel2))))))
                .addContainerGap())
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.CENTER)
                    .addComponent(btnInsertar)
                    .addComponent(btnModificar)
                    .addComponent(btnEliminar))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.CENTER)
                    .addComponent(lbAñoSeccion)
                    .addComponent(cbAño, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(jLabel1))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(lbNivelSeccion)
                    .addComponent(cbNivel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(jLabel2))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(lbSeccion)
                    .addComponent(cbSeccion, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(jLabel3))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.CENTER)
                    .addComponent(cbCedulaGuia, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(lbProfesorGuia)
                    .addComponent(cbNombreProfGuia, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.CENTER)
                    .addComponent(lbCupoMaximo)
                    .addComponent(spinCupoMaximo, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.CENTER)
                    .addComponent(txtCantidadEstudiantes, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(lbCantidadEstudiantes))
                .addGap(4, 4, 4)
                .addComponent(scrollGridSecciones, javax.swing.GroupLayout.PREFERRED_SIZE, 127, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(btnCancelar)
                    .addComponent(btnAceptar))
                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
        );

        cbAño.addActionListener(this);
        cbNivel.addActionListener(this);
        cbSeccion.addActionListener(this);
        this.cbCedulaGuia.addItemListener(this);
        this.cbNombreProfGuia.addItemListener(this);
    }// </editor-fold>//GEN-END:initComponents


    // Variables declaration - do not modify//GEN-BEGIN:variables
    private javax.swing.JButton btnAceptar;
    private javax.swing.JButton btnCancelar;
    private javax.swing.JButton btnEliminar;
    private javax.swing.JButton btnInsertar;
    private javax.swing.JButton btnModificar;
    private javax.swing.JComboBox cbAño;
    private javax.swing.JComboBox cbCedulaGuia;
    private javax.swing.JComboBox cbNivel;
    private javax.swing.JComboBox cbNombreProfGuia;
    private javax.swing.JComboBox cbSeccion;
    private javax.swing.JTable gridSecciones;
    private javax.swing.JLabel jLabel1;
    private javax.swing.JLabel jLabel2;
    private javax.swing.JLabel jLabel3;
    private javax.swing.JLabel lbAñoSeccion;
    private javax.swing.JLabel lbCantidadEstudiantes;
    private javax.swing.JLabel lbCupoMaximo;
    private javax.swing.JLabel lbNivelSeccion;
    private javax.swing.JLabel lbProfesorGuia;
    private javax.swing.JLabel lbSeccion;
    private javax.swing.JScrollPane scrollGridSecciones;
    private javax.swing.JSpinner spinCupoMaximo;
    private javax.swing.JTextField txtCantidadEstudiantes;
    // End of variables declaration//GEN-END:variables

}
